package cn.zyl.demo.common.boot.annotation;

import cn.zyl.demo.common.boot.constraint.EncryptUserNameValidator;

import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;

/**
 * EncryptUserName注解说明: 自定义校验注解
 * <pre>
 * @ Null               被注释的元素必须为 null
 * @ NotNull            被注释的元素必须不为 null                                    @NotNull(message = “身份证不能为空”)
 * @ AssertTrue         被注释的元素必须为 true                                      @AssertTrue(message = “”)
 * @ AssertFalse        被注释的元素必须为 false                                     @AssertFalse(message = “”)
 * @ Min(value)         被注释的元素必须是一个数字，其值必须大于等于指定的最小值            @Min(value= 18 ,message= “必须年满18岁！”)
 * @ Max(value)         被注释的元素必须是一个数字，其值必须小于等于指定的最大值            @Max(value = 100, message = “年龄不能大于100岁”)
 * @ DecimalMin(value)  被注释的元素必须是一个数字，其值必须大于等于指定的最小值            @DecimalMin(value = “0.01”, inclusive = true,message=“最小值是0.01”)
 * @ DecimalMax(value)  被注释的元素必须是一个数字，其值必须小于等于指定的最大值            @DecimalMax(value = “100”, inclusive = true,message=“decim最大值是100”)
 * @ Size(max=, min=)   被注释的元素的大小必须在指定的范围内                            @size(min=6, max=20, message=“密码长度只能在6-20之间”)
 * @ Digits (integer, fraction) 被注释的元素必须是一个数字，其值必须在可接受的范围内       @Digits (integer = 2, fraction = 20)
 * @ Past               被注释的元素必须是一个过去的日期                               @Past(message=””)
 * @ Future             被注释的元素必须是一个将来的日期                               @Future(message=””)
 * @ Pattern(regex=,flag=)      被注释的元素必须符合指定的正则表达式                    @Pattern(regexp="[a-za-z0-9._%±]+@[a-za-z0-9.-]+\.[a-za-z]{2,4}",message = “邮件格式错误”)
 * -------Hibernate Validator 附加的 constraint-------
 * @ NotBlank(message =)        验证字符串非null，且长度必须大于0                     @NotBlank(message =)
 * @ Email               被注释的元素必须是电子邮箱地址                               @Email(message = “输入正确的邮箱”)
 * @ Length(min=,max=)   被注释的字符串的大小必须在指定的范围内                         @Length(min = 5, max = 20, message = “用户名长度必须位于5到20之间”)
 * @ NotEmpty            被注释的字符串的必须非空                                    @NotEmpty (message = " ")
 * @ Range(min=,max=,message=)  被注释的元素必须在合适的范围内                        @Range(min=,max=,message=)
 * </pre>
 * @author wsz
 * @version v1.0
 * @date 2020-08-10
 */
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Constraint(validatedBy = {EncryptUserNameValidator.class} )
@Target({ElementType.METHOD,ElementType.FIELD,ElementType.ANNOTATION_TYPE,ElementType.CONSTRUCTOR,ElementType.PARAMETER})
public @interface EncryptUserName {
    /**
     *  默认错误消息
     * @return 错误信息
     */
    String message() default "登录用户名：大小写字母开头，5-20位字符";
    /**
     * 分组
     * @return 分组类
     */
    Class<?>[] groups() default {};
    /**
     * 校验数据的负载类
     * @return 校验类
     */
    Class<? extends Payload>[] payload() default {};
}
